package com.unitd.base.module.consumer.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.unitd.base.frame.plugin.module.dto.ResponseUtils;
import com.unitd.base.frame.util.StringUtils;
import com.unitd.base.module.consumer.comm.annotation.IgnoreAuth;
import com.unitd.base.module.consumer.comm.annotation.LoginUser;
import com.unitd.base.module.consumer.comm.controller.ApiBaseAction;
import com.unitd.base.module.consumer.comm.enums.UserLevelEnum;
import com.unitd.base.module.master.pojo.dto.CompanyUserVO;
import com.unitd.base.module.master.pojo.dto.UserVO;
import com.unitd.base.module.master.service.CompanyUserService;
import com.unitd.base.module.master.service.SmsLogService;
import com.unitd.base.module.master.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 提供给微信小程序使用的用户服务接口类
 *
 * @author hudan
 * @version 1.0
 * @filename ApiUserController.java
 * @copyright www.symdata.cn
 * @date 2020-07-08
 */
@Api(tags = "A-用户信息管理")
@RestController
@RequestMapping("/api/user")
public class ApiUserController extends ApiBaseAction {

    @Autowired
    private UserService userService;
    @Autowired
    private SmsLogService smsLogService;
    @Autowired
    private CompanyUserService companyUserService;
    /**
     * 发送短信验证码
     *
     * @return 得到反馈
     */
    @ApiOperation(value = "发送短信")
    @PostMapping("smscode")
    @IgnoreAuth
    public Object smscode() {
        JSONObject jsonParams = getJsonRequest();
        String phone = jsonParams.getString("phone");

        // 得到验证码
        smsLogService.sendVerifyCode(phone);
        return ResponseUtils.toResponsSuccess("短信发送成功");
    }

    /**
     * 绑定手机
     */
    @ApiOperation(value = "绑定手机")
    @PostMapping("bindMobile")
    public Object bindMobile(@LoginUser UserVO loginUser) {
        /* 得到请求参数信息 */
        JSONObject jsonParams = getJsonRequest();

        return userService.bindMobile(loginUser, jsonParams);
    }

    /**
     * 根据当前登录的公司管理员信息,获取该公司下的有效公司用户列表
     *
     * @param loginUser 当前登录的公司管理员
     * @return 公司用户列表
     */
    @ApiOperation(value = "获取当前登录的公司管理员下的所有公司用户列表", response = Map.class)
    @PostMapping("lists")
    public Map<String, Object> lists(@LoginUser UserVO loginUser) {

        Long userLevelId = loginUser.getUserLevelId();
        /* 定义查询条件 */
        Map<String, Object> param = Maps.newHashMap();
        if (userLevelId != 4) {
            param.put("status", 1);
        }
        param.put("userLevelId", 4);
        param.put("companyId", loginUser.getCompanyDatasource().getCompanyId());

        // 发起分页查询
        List<CompanyUserVO> companyUsers = companyUserService.selectByCompanyIdAndUserLevelId(param);
        return ResponseUtils.toResponsSuccess(companyUsers);
    }

    /**
     * 根据当前登录的公司管理员信息以及公司用户编号,获取该用户详情
     *
     * @return 公司用户详情
     */
    @ApiOperation(value = "获取当前登录的公司管理员下的所指定用户详情", response = Map.class)
    @PostMapping("detail")
    public Map<String, Object> detail(Long id, @LoginUser UserVO loginUser) {
        Long companyId = loginUser.getCompanyDatasource().getCompanyId();

        CompanyUserVO companyUser = companyUserService.selectByCompanyIdAndUserId(companyId, id);
        return ResponseUtils.toResponsSuccess(companyUser);
    }

    /**
     * 保存公司用户信息
     *
     * @return 保存结果
     */
    @ApiOperation(value = "新增/修改当前登录的公司管理员下的所指定用户详情", response = Map.class)
    @PostMapping("save")
    public Map<String, Object> save(@LoginUser UserVO loginUser) {
        JSONObject jsonParam = this.getJsonRequest();
        Long userId = jsonParam.getLong("userId");
        CompanyUserVO companyUser = JSON.toJavaObject(jsonParam, CompanyUserVO.class);
        companyUser.setId(userId);
        // 新建公司用户信息，默认为3
        companyUser.setUserLevelId(UserLevelEnum.COMPANY_USER.getKey());
        companyUser.setCompanyId(loginUser.getCompanyDatasource().getCompanyId());
        if (StringUtils.isNull(companyUser.getNickName())) {
            companyUser.setNickName(companyUser.getUserName());
        }

        companyUserService.save(companyUser);

        return ResponseUtils.toResponsSuccess("保存成功!");
    }

    /**
     * 删除指定的公司客戶信息
     *
     * @return 删除结果
     */
    @ApiOperation(value = "删除指定的公司客戶信息", response = Map.class)
    @DeleteMapping("delete")
    public Object delete() {
        JSONObject jsonParam = this.getJsonRequest();
        Long id = jsonParam.getLongValue("id");
        companyUserService.deleteById(id);
        return ResponseUtils.toResponsSuccess("刪除成功!");
    }
}